using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Configuration;
using System.Runtime.CompilerServices;
using DG.Common.EF.WPF;
using DG.Common.Patterns.MVVM;
using TCC.ControleFluxoDeCaixa.Annotations;
using TCC.ControleFluxoDeCaixa.Model.Contas;
using TCC.ControleFluxoDeCaixa.Model.Usuarios;

namespace TCC.ControleFluxoDeCaixa.Model.Fluxo
{
    public class Emprestimo : NotifyViewModel
    {
        private int? _lancamentoId;
        private Pessoa _pessoa;
        private Lancamento _saida;
        private int _lancamentoSaidaId;
        private DateTime? _vencimento;
        private DateTime _dataDoLancamento;
        private Lancamento _pagamento;
        private string _nome;
        private Usuario _usuario;

        [Key]
        [Browsable(false)]
        public int EmprestimoId { get; set; }

        public string Nome
        {
            get { return _nome; }
            set
            {
                if (value == _nome) return;
                _nome = value;
                OnPropertyChanged("Nome");
            }
        }

        [Required]
        public DateTime DataDoLancamento
        {
            get { return _dataDoLancamento; }
            set
            {
                if (value.Equals(_dataDoLancamento)) return;
                _dataDoLancamento = value;
                OnPropertyChanged("DataDoLancamento");
            }
        }

        public DateTime? Vencimento
        {
            get { return _vencimento; }
            set
            {
                if (value.Equals(_vencimento)) return;
                _vencimento = value;
                OnPropertyChanged("Vencimento");
                OnPropertyChanged("StatusVencimento");
            }
        }
        [Browsable(false)]
        public int LancamentoSaidaId
        {
            get { return _lancamentoSaidaId; }
            set
            {
                if (value == _lancamentoSaidaId) return;
                _lancamentoSaidaId = value;
                OnPropertyChanged("LancamentoSaidaId");
            }
        }

        [ForeignKey("LancamentoSaidaId")]
        [FilteredAtributte(false)]
        public virtual Lancamento Saida
        {
            get { return _saida; }
            set
            {
                if (Equals(value, _saida)) return;
                _saida = value;
                OnPropertyChanged("Saida");
                OnPropertyChanged("StatusPagamento");
            }
        }

        [Required]
        public virtual Pessoa Pessoa
        {
            get { return _pessoa; }
            set
            {
                if (Equals(value, _pessoa)) return;
                _pessoa = value;
                OnPropertyChanged("Pessoa");
            }
        }
        [FilteredAtributte(false)]
        public TipoDeMovimento TipoDeMovimento { get; set; }

        [Browsable(false)]
        public int? LancamentoId
        {
            get { return _lancamentoId; }
            set
            {
                if (value == _lancamentoId) return;
                _lancamentoId = value;
                OnPropertyChanged("LancamentoId");
            }
        }

        [ForeignKey("LancamentoId")]
        [CanBeNull]
        [FilteredAtributte(false)]
        public virtual Lancamento Pagamento
        {
            get { return _pagamento; }
            set
            {
                if (Equals(value, _pagamento)) return;
                _pagamento = value;
                OnPropertyChanged("Pagamento");
                OnPropertyChanged("StatusPagamento");
            }
        }

        public StatusPagamento StatusPagamento
        {
            get
            {
                if (Pagamento == null || Pagamento.Valor == 0) return StatusPagamento.NaoLiquidado;
                return (Pagamento.Valor >= Saida.Valor)
                    ? StatusPagamento.Liquidado
                    : StatusPagamento.ParcialmenteQuitado;
            }
        }
        public StatusVencimento StatusVencimento
        {
            get
            {
                if (StatusPagamento == StatusPagamento.Liquidado) return StatusVencimento.Quitado;
                
                return (!Vencimento.HasValue || DateTime.Now.Date >= Vencimento)
                    ? StatusVencimento.AVencer
                    : StatusVencimento.Vencido;
            }
        }

        [FilteredAtributte(false)]
        public virtual Usuario Usuario
        {
            get { return _usuario; }
            set
            {
                if (Equals(value, _usuario)) return;
                _usuario = value;
                OnPropertyChanged("Usuario");
            }
        }

        

        public override string ToString()
        {
            return Nome ?? base.ToString();
        }
    }
}